Generators power all adjacent tiles.
Wires conduct power to all adjacent tiles.
Pistons extend when powered and retract when losing power.
Wires are sticky and can be pulled by pistons.
Units provide a subgrid, i.e. an integrated circuit, that can be interacted with via the unit ports.
Blocks can be anchored to prevent them from being pulled or pushed.
Anchored Units will expose their subgrids, such that pistons can interact with their inner logic via their ports.
Check out the examples section for inspiration!
The game runs on a 2D grid.
The world advances in discrete ticks.
During each tick:
Power is propagated.
Pistons decide whether to extend or retract.
Piston actions resolve in a fixed order.
All actions in a tick are deterministic: either a piston fully succeeds, or it does nothing.
Does nothing but existing.
Generators power their adjacent tiles.
Power spreads through:
Wires
Extended pistons
Wires transmit power in all directions.
Wires can be:
Pushed by pistons
Pulled by retracting pistons, under specific conditions (see Pistons → Retraction).
Wires are the only blocks that enable pulling chains.
Pistons are directional blocks that react to power.
A piston:
Extends when powered
Retracts when unpowered
Conducts power when extended
Pistons do not accept power from their front.
When extending, a piston tries to push all blocks in front of it by one tile.
Pistons can push:
Wires
Generators
Units (if not blocked)
Unextended pistons
Out of the ports of units, interacting with the parent grid
Into the subgrids of anchored units
Pistons cannot push:
Extended pistons
Piston heads
Grid boundaries
If anything blocks the chain, the piston does not extend.
When extended, a piston creates a piston head in front of it.
Piston heads:
Occupy a tile
Block movement
Are removed when the piston retracts
A piston can pull blocks inward if:
The block directly in front of the piston head is a wire
The pulled chain consists of:
Any number of wires
At most one non-wire block between wires
The pull chain ends when:
An empty block is encountered
Two non-wire blocks are in the chain
An anchored block is encountered
Retraction is blocked when:
A valid pull chain is in front of the piston head, consisting of wires and at most one intermittent non-wire block
And somewhere in the pull chain is an extended piston or piston head
Pistons can therefore be extended and unpowered at the same time, as long as the pull chain is blocked.
Piston Chain: multiple pistons in line pointing into the same direction with wires inbetween will extend one by one when powered, if in the right order. When unpowered only the first extended piston in the chain will retract each tick, enabling ordered retraction of the whole chain over multiple ticks.
Timer: powered pistons will extend and in the next tick conduct power. Multiple pistons adjacent to each other will therefore extend one by one per tick if the first piston in the line is powered.
Storage: Extending a piston A with a wire in front, "docking" to an extended piston B or its piston head will keep piston A extended as long as piston B will remain extended, even if piston A is unpowered.
A unit occupies one tile on its parent grid.
Each unit contains its own internal grid (a sub-grid).
Units act as both:
A physical block
A portal into their internal structure
Units can be pushed or pulled by pistons like blocks.
Power can enter a unit through its ports (center tiles on each edge).
Pushes and pulls can exit a unit through its ports.
Pushes and pulls can enter an anchored unit through its ports. If unanchored, the unit will be pushed and pulled like a regular block.
Once inside, interactions continue inside the unit’s internal grid.
Traversing multiple units at once is possible.
A unit is considered blocked if:
A piston is extended into it from outside
An internal piston is extended outward through a port
Blocked units cannot be moved and will block piston chains.
A collector is a directional block that stores blocks.
Each tick it interacts with the tile directly in front of it.
Collectors do not push or pull chains.
Unpowered: collects the tile in front of it into internal storage.
The tile must not be empty, anchored, blocked this tick, a piston head, or an extended piston.
The collector must have free storage space (max 25 blocks).
Powered from side or rear: places one stored block in front of it instead.
The front tile must be empty.
If no stored block is available, nothing happens.
A mover is a control block inside a unit that moves the unit itself.
When powered from exactly one direction, the unit moves one tile in that direction.
The target tile must be empty.
If the unit is blocked, the mover does nothing.
A unit can move at most once per tick.
Anchoring can be applied to any block.
An anchored block:
Cannot be pushed
Cannot be pulled
Enables piston chains to enter units instead of pushing or pulling the unit itself
Anchored units behave differently:
They do not move
Pistons, power, and movement may still enter the unit
Anchoring a unit turns it into a fixed gateway instead of a movable block.
Every piston action is atomic:
Either the entire chain moves
Or nothing happens
When a piston successfully executes:
All affected tiles become blocked for the rest of the tick
Blocked tiles:
Blocks occupying a blocked tile cannot be moved again during the current tick
Empty blocked tiles cannot be moved onto during the current tick
Prevent conflicting piston actions
This prevents paradoxes and race conditions.
Power is cleared
Power propagates from generators through wires and pistons
Piston blockages are reset
Pistons and units resolve according to their order
Earlier pistons may block later ones
Units execute in their assigned order and resolve their subgrid
Two pistons targeting the same space:
The one executed first may succeed
The other may fail due to blocking
This allows intentional timing and priority designs